Micron Document
welo git mirrors

Node / public / reticulum / files / RNS / Resource.py

Displaying Raw • Download

RNS/Resource.py 0.5.8 (a77ec432) Text, 46.00 KB

T8b949e# MIT License
T8b949e#
T8b949e# Copyright (c) 2016-2022 Mark Qvist / unsigned.io
T8b949e#
T8b949e# Permission is hereby granted, free of charge, to any person obtaining a copy
T8b949e# of this software and associated documentation files (the "Software"), to deal
T8b949e# in the Software without restriction, including without limitation the rights
T8b949e# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
T8b949e# copies of the Software, and to permit persons to whom the Software is
T8b949e# furnished to do so, subject to the following conditions:
T8b949e#
T8b949e# The above copyright notice and this permission notice shall be included in all
T8b949e# copies or substantial portions of the Software.
T8b949e#
T8b949e# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
T8b949e# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
T8b949e# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
T8b949e# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
T8b949e# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
T8b949e# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
T8b949e# SOFTWARE.

Tff7b72import T7ee787RNS
Tff7b72import T7ee787os
Tff7b72import T7ee787bz2
Tff7b72import T7ee787math
Tff7b72import T7ee787time
Tff7b72import T7ee787threading
Tff7b72from T7ee787.T7ee787vendor Tff7b72import Te6edf3umsgpack Tff7b72as Te6edf3umsgpack
Tff7b72from T7ee787time Tff7b72import Te6edf3sleep

Tff7b72class T56d364ResourceTb4b4b4:
T8b949e"""
The Resource class allows transferring arbitrary amounts
of data over a link. It will automatically handle sequencing,
compression, coordination and checksumming.

:param data: The data to be transferred. Can be *bytes* or an open *file handle*. See the :ref:`Filetransfer Example<example-filetransfer>` for details.
:param link: The :ref:`RNS.Link<api-link>` instance on which to transfer the data.
:param advertise: Optional. Whether to automatically advertise the resource. Can be *True* or *False*.
:param auto_compress: Optional. Whether to auto-compress the resource. Can be *True* or *False*.
:param callback: An optional *callable* with the signature *callback(resource)*. Will be called when the resource transfer concludes.
:param progress_callback: An optional *callable* with the signature *callback(resource)*. Will be called whenever the resource transfer progress is updated.
"""

T8b949e# The initial window size at beginning of transfer
Te6edf3WINDOW Tff7b72= T79c0ff4

T8b949e# Absolute minimum window size during transfer
Te6edf3WINDOW_MIN Tff7b72= T79c0ff1

T8b949e# The maximum window size for transfers on slow links
Te6edf3WINDOW_MAX_SLOW Tff7b72= T79c0ff10

T8b949e# The maximum window size for transfers on fast links
Te6edf3WINDOW_MAX_FAST Tff7b72= T79c0ff75
T8b949e# For calculating maps and guard segments, this
T8b949e# must be set to the global maximum window.
Te6edf3WINDOW_MAX Tff7b72= Te6edf3WINDOW_MAX_FAST
T8b949e# If the fast rate is sustained for this many request
T8b949e# rounds, the fast link window size will be allowed.
Te6edf3FAST_RATE_THRESHOLD Tff7b72= Te6edf3WINDOW_MAX_SLOW Tff7b72- Te6edf3WINDOW Tff7b72- T79c0ff2

T8b949e# If the RTT rate is higher than this value,
T8b949e# the max window size for fast links will be used.
T8b949e# The default is 50 Kbps (the value is stored in
T8b949e# bytes per second, hence the "/ 8").
Te6edf3RATE_FAST Tff7b72= Tb4b4b4(T79c0ff50Tff7b72*T79c0ff1000Tb4b4b4) Tff7b72/ T79c0ff8

T8b949e# The minimum allowed flexibility of the window size.
T8b949e# The difference between window_max and window_min
T8b949e# will never be smaller than this value.
Te6edf3WINDOW_FLEXIBILITY Tff7b72= T79c0ff4

T8b949e# Number of bytes in a map hash
Te6edf3MAPHASH_LEN Tff7b72= T79c0ff4
Te6edf3SDU Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffMDU
Te6edf3RANDOM_HASH_SIZE Tff7b72= T79c0ff4

T8b949e# This is an indication of what the
T8b949e# maximum size a resource should be, if
T8b949e# it is to be handled within reasonable
T8b949e# time constraint, even on small systems.
T8b949e#
T8b949e# A small system in this regard is
T8b949e# defined as a Raspberry Pi, which should
T8b949e# be able to compress, encrypt and hash-map
T8b949e# the resource in about 10 seconds.
T8b949e#
T8b949e# This constant will be used when determining
T8b949e# how to sequence the sending of large resources.
T8b949e#
T8b949e# Capped at 16777215 (0xFFFFFF) per segment to
T8b949e# fit in 3 bytes in resource advertisements.
Te6edf3MAX_EFFICIENT_SIZE Tff7b72= T79c0ff16 Tff7b72* T79c0ff1024 Tff7b72* T79c0ff1024 Tff7b72- T79c0ff1
Te6edf3RESPONSE_MAX_GRACE_TIME Tff7b72= T79c0ff10
T8b949e# The maximum size to auto-compress with
T8b949e# bz2 before sending.
Te6edf3AUTO_COMPRESS_MAX_SIZE Tff7b72= Te6edf3MAX_EFFICIENT_SIZE

Te6edf3PART_TIMEOUT_FACTOR Tff7b72= T79c0ff4
Te6edf3PART_TIMEOUT_FACTOR_AFTER_RTT Tff7b72= T79c0ff2
Te6edf3MAX_RETRIES Tff7b72= T79c0ff8
Te6edf3MAX_ADV_RETRIES Tff7b72= T79c0ff4
Te6edf3SENDER_GRACE_TIME Tff7b72= T79c0ff10
Te6edf3RETRY_GRACE_TIME Tff7b72= T79c0ff0.25
Te6edf3PER_RETRY_DELAY Tff7b72= T79c0ff0.5

Te6edf3WATCHDOG_MAX_SLEEP Tff7b72= T79c0ff1

Te6edf3HASHMAP_IS_NOT_EXHAUSTED Tff7b72= T79c0ff0x00
Te6edf3HASHMAP_IS_EXHAUSTED Tff7b72= T79c0ff0xFF

T8b949e# Status constants
Te6edf3NONE Tff7b72= T79c0ff0x00
Te6edf3QUEUED Tff7b72= T79c0ff0x01
Te6edf3ADVERTISED Tff7b72= T79c0ff0x02
Te6edf3TRANSFERRING Tff7b72= T79c0ff0x03
Te6edf3AWAITING_PROOF Tff7b72= T79c0ff0x04
Te6edf3ASSEMBLING Tff7b72= T79c0ff0x05
Te6edf3COMPLETE Tff7b72= T79c0ff0x06
Te6edf3FAILED Tff7b72= T79c0ff0x07
Te6edf3CORRUPT Tff7b72= T79c0ff0x08

Tf0883e@staticmethod
Tff7b72def Td2a8ffacceptTb4b4b4(Te6edf3advertisement_packetTb4b4b4, Te6edf3callbackTff7b72=Tff7b72NoneTb4b4b4, Te6edf3progress_callback Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3request_id Tff7b72= Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3adv Tff7b72= Te6edf3ResourceAdvertisementTff7b72.Td2a8ffunpackTb4b4b4(Te6edf3advertisement_packetTff7b72.Td2a8ffplaintextTb4b4b4)

Te6edf3resource Tff7b72= Te6edf3ResourceTb4b4b4(Tff7b72NoneTb4b4b4, Te6edf3advertisement_packetTff7b72.Td2a8fflinkTb4b4b4, Te6edf3request_id Tff7b72= Te6edf3request_idTb4b4b4)
Te6edf3resourceTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffTRANSFERRING

Te6edf3resourceTff7b72.Td2a8ffflags Tff7b72= Te6edf3advTff7b72.Td2a8fff
Te6edf3resourceTff7b72.Td2a8ffsize Tff7b72= Te6edf3advTff7b72.Td2a8fft
Te6edf3resourceTff7b72.Td2a8fftotal_size Tff7b72= Te6edf3advTff7b72.Td2a8ffd
Te6edf3resourceTff7b72.Td2a8ffuncompressed_size Tff7b72= Te6edf3advTff7b72.Td2a8ffd
Te6edf3resourceTff7b72.Td2a8ffhash Tff7b72= Te6edf3advTff7b72.Td2a8ffh
Te6edf3resourceTff7b72.Td2a8fforiginal_hash Tff7b72= Te6edf3advTff7b72.Td2a8ffo
Te6edf3resourceTff7b72.Td2a8ffrandom_hash Tff7b72= Te6edf3advTff7b72.Td2a8ffr
Te6edf3resourceTff7b72.Td2a8ffhashmap_raw Tff7b72= Te6edf3advTff7b72.Td2a8ffm
Te6edf3resourceTff7b72.Td2a8ffencrypted Tff7b72= Tff7b72True Tff7b72if Te6edf3resourceTff7b72.Td2a8ffflags Tff7b72& T79c0ff0x01 Tff7b72else Tff7b72False
Te6edf3resourceTff7b72.Td2a8ffcompressed Tff7b72= Tff7b72True Tff7b72if Te6edf3resourceTff7b72.Td2a8ffflags Tff7b72>> T79c0ff1 Tff7b72& T79c0ff0x01 Tff7b72else Tff7b72False
Te6edf3resourceTff7b72.Td2a8ffinitiator Tff7b72= Tff7b72False
Te6edf3resourceTff7b72.Td2a8ffcallback Tff7b72= Te6edf3callback
Te6edf3resourceTff7b72.Td2a8ff__progress_callback Tff7b72= Te6edf3progress_callback
Te6edf3resourceTff7b72.Td2a8fftotal_parts Tff7b72= Tffa657intTb4b4b4(Te6edf3mathTff7b72.Td2a8ffceilTb4b4b4(Te6edf3resourceTff7b72.Td2a8ffsizeTff7b72/Tffa657floatTb4b4b4(Te6edf3ResourceTff7b72.Td2a8ffSDUTb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3resourceTff7b72.Td2a8ffreceived_count Tff7b72= T79c0ff0
Te6edf3resourceTff7b72.Td2a8ffoutstanding_parts Tff7b72= T79c0ff0
Te6edf3resourceTff7b72.Td2a8ffparts Tff7b72= Tb4b4b4[Tff7b72NoneTb4b4b4] Tff7b72* Te6edf3resourceTff7b72.Td2a8fftotal_parts
Te6edf3resourceTff7b72.Td2a8ffwindow Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffWINDOW
Te6edf3resourceTff7b72.Td2a8ffwindow_max Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffWINDOW_MAX_SLOW
Te6edf3resourceTff7b72.Td2a8ffwindow_min Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffWINDOW_MIN
Te6edf3resourceTff7b72.Td2a8ffwindow_flexibility Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffWINDOW_FLEXIBILITY
Te6edf3resourceTff7b72.Td2a8fflast_activity Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)

Te6edf3resourceTff7b72.Td2a8ffstoragepath Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffresourcepathTff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Te6edf3resourceTff7b72.Td2a8fforiginal_hashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)
Te6edf3resourceTff7b72.Td2a8ffsegment_index Tff7b72= Te6edf3advTff7b72.Td2a8ffi
Te6edf3resourceTff7b72.Td2a8fftotal_segments Tff7b72= Te6edf3advTff7b72.Td2a8ffl
Tff7b72if Te6edf3advTff7b72.Td2a8ffl Tff7b72> T79c0ff1Tb4b4b4:
Te6edf3resourceTff7b72.Td2a8ffsplit Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Te6edf3resourceTff7b72.Td2a8ffsplit Tff7b72= Tff7b72False

Te6edf3resourceTff7b72.Td2a8ffhashmap Tff7b72= Tb4b4b4[Tff7b72NoneTb4b4b4] Tff7b72* Te6edf3resourceTff7b72.Td2a8fftotal_parts
Te6edf3resourceTff7b72.Td2a8ffhashmap_height Tff7b72= T79c0ff0
Te6edf3resourceTff7b72.Td2a8ffwaiting_for_hmu Tff7b72= Tff7b72False

Te6edf3resourceTff7b72.Td2a8ffreceiving_part Tff7b72= Tff7b72False

Te6edf3resourceTff7b72.Td2a8ffconsecutive_completed_height Tff7b72= T79c0ff0
Tff7b72if Tff7b72not Te6edf3resourceTff7b72.Td2a8fflinkTff7b72.Td2a8ffhas_incoming_resourceTb4b4b4(Te6edf3resourceTb4b4b4)Tb4b4b4:
Te6edf3resourceTff7b72.Td2a8fflinkTff7b72.Td2a8ffregister_incoming_resourceTb4b4b4(Te6edf3resourceTb4b4b4)

Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAccepting resource advertisement for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3resourceTff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Te6edf3resourceTff7b72.Td2a8fflinkTff7b72.Td2a8ffcallbacksTff7b72.Td2a8ffresource_started Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3resourceTff7b72.Td2a8fflinkTff7b72.Td2a8ffcallbacksTff7b72.Td2a8ffresource_startedTb4b4b4(Te6edf3resourceTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while executing resource started callback from Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3resourceTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Te6edf3resourceTff7b72.Td2a8ffhashmap_updateTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3resourceTff7b72.Td2a8ffhashmap_rawTb4b4b4)

Te6edf3resourceTff7b72.Td2a8ffwatchdog_jobTb4b4b4(Tb4b4b4)

Tff7b72return Te6edf3resource

Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffIgnoring resource advertisement for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3resourceTff7b72.Td2a8ffhashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff, resource already transferringTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72return Tff7b72None

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not decode resource advertisement, dropping resourceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72return Tff7b72None

T8b949e# Create a resource for transmission to a remote destination
T8b949e# The data passed can be either a bytes-array or a file opened
T8b949e# in binary read mode.
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3advertiseTff7b72=Tff7b72TrueTb4b4b4, Te6edf3auto_compressTff7b72=Tff7b72TrueTb4b4b4, Te6edf3callbackTff7b72=Tff7b72NoneTb4b4b4, Te6edf3progress_callbackTff7b72=Tff7b72NoneTb4b4b4, Te6edf3timeout Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3segment_index Tff7b72= T79c0ff1Tb4b4b4, Te6edf3original_hash Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3request_id Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3is_response Tff7b72= Tff7b72FalseTb4b4b4)Tb4b4b4:
Te6edf3data_size Tff7b72= Tff7b72None
Te6edf3resource_data Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffassembly_lock Tff7b72= Tff7b72False

Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3dataTb4b4b4, Ta5d6ff"Ta5d6ffreadTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3data_size Tff7b72= Te6edf3osTff7b72.Td2a8ffstatTb4b4b4(Te6edf3dataTff7b72.Td2a8ffnameTb4b4b4)Tff7b72.Td2a8ffst_size
Tff7b72selfTff7b72.Td2a8fftotal_size Tff7b72= Te6edf3data_size
Tff7b72selfTff7b72.Td2a8ffgrand_total_parts Tff7b72= Te6edf3mathTff7b72.Td2a8ffceilTb4b4b4(Te6edf3data_sizeTff7b72/Te6edf3ResourceTff7b72.Td2a8ffSDUTb4b4b4)

Tff7b72if Te6edf3data_size Tff7b72<Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffMAX_EFFICIENT_SIZETb4b4b4:
Tff7b72selfTff7b72.Td2a8fftotal_segments Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ffsegment_index Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ffsplit Tff7b72= Tff7b72False
Te6edf3resource_data Tff7b72= Te6edf3dataTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Te6edf3dataTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftotal_segments Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3data_sizeTff7b72-T79c0ff1Tb4b4b4)Tff7b72/Tff7b72/Te6edf3ResourceTff7b72.Td2a8ffMAX_EFFICIENT_SIZETb4b4b4)Tff7b72+T79c0ff1
Tff7b72selfTff7b72.Td2a8ffsegment_index Tff7b72= Te6edf3segment_index
Tff7b72selfTff7b72.Td2a8ffsplit Tff7b72= Tff7b72True
Te6edf3seek_index Tff7b72= Te6edf3segment_indexTff7b72-T79c0ff1
Te6edf3seek_position Tff7b72= Te6edf3seek_indexTff7b72*Te6edf3ResourceTff7b72.Td2a8ffMAX_EFFICIENT_SIZE

Te6edf3dataTff7b72.Td2a8ffseekTb4b4b4(Te6edf3seek_positionTb4b4b4)
Te6edf3resource_data Tff7b72= Te6edf3dataTff7b72.Td2a8ffreadTb4b4b4(Te6edf3ResourceTff7b72.Td2a8ffMAX_EFFICIENT_SIZETb4b4b4)
Tff7b72selfTff7b72.Td2a8ffinput_file Tff7b72= Te6edf3data

Tff7b72elif Tffa657isinstanceTb4b4b4(Te6edf3dataTb4b4b4, Tffa657bytesTb4b4b4)Tb4b4b4:
Te6edf3data_size Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffgrand_total_parts Tff7b72= Te6edf3mathTff7b72.Td2a8ffceilTb4b4b4(Te6edf3data_sizeTff7b72/Te6edf3ResourceTff7b72.Td2a8ffSDUTb4b4b4)
Tff7b72selfTff7b72.Td2a8fftotal_size Tff7b72= Te6edf3data_size
Te6edf3resource_data Tff7b72= Te6edf3data
Tff7b72selfTff7b72.Td2a8fftotal_segments Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ffsegment_index Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ffsplit Tff7b72= Tff7b72False

Tff7b72elif Te6edf3data Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72pass

Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid data instance type passed to resource initialisationTa5d6ff"Tb4b4b4)

Te6edf3data Tff7b72= Te6edf3resource_data

Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffNONE
Tff7b72selfTff7b72.Td2a8fflink Tff7b72= Te6edf3link
Tff7b72selfTff7b72.Td2a8ffmax_retries Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffMAX_RETRIES
Tff7b72selfTff7b72.Td2a8ffmax_adv_retries Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffMAX_ADV_RETRIES
Tff7b72selfTff7b72.Td2a8ffretries_left Tff7b72= Tff7b72selfTff7b72.Td2a8ffmax_retries
Tff7b72selfTff7b72.Td2a8fftimeout_factor Tff7b72= Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8fftraffic_timeout_factor
Tff7b72selfTff7b72.Td2a8ffpart_timeout_factor Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffPART_TIMEOUT_FACTOR
Tff7b72selfTff7b72.Td2a8ffsender_grace_time Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffSENDER_GRACE_TIME
Tff7b72selfTff7b72.Td2a8ffhmu_retry_ok Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffwatchdog_lock Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff__watchdog_job_id Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ff__progress_callback Tff7b72= Te6edf3progress_callback
Tff7b72selfTff7b72.Td2a8ffrtt Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffrtt_rxd_bytes Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffreq_sent Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffreq_resp_rtt_rate Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffrtt_rxd_bytes_at_part_req Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8fffast_rate_rounds Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffrequest_id Tff7b72= Te6edf3request_id
Tff7b72selfTff7b72.Td2a8ffis_response Tff7b72= Te6edf3is_response

Tff7b72selfTff7b72.Td2a8ffreq_hashlist Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffreceiver_min_consecutive_height Tff7b72= T79c0ff0

Tff7b72if Te6edf3timeout Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftimeout Tff7b72= Te6edf3timeout
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftimeout Tff7b72= Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffrtt Tff7b72* Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8fftraffic_timeout_factor

Tff7b72if Te6edf3data Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffinitiator Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffcallback Tff7b72= Te6edf3callback
Tff7b72selfTff7b72.Td2a8ffuncompressed_data Tff7b72= Te6edf3data

Te6edf3compression_began Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3auto_compress Tff7b72and Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffuncompressed_dataTb4b4b4) Tff7b72< Te6edf3ResourceTff7b72.Td2a8ffAUTO_COMPRESS_MAX_SIZETb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCompressing resource data...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcompressed_data Tff7b72= Te6edf3bz2Tff7b72.Td2a8ffcompressTb4b4b4(Tff7b72selfTff7b72.Td2a8ffuncompressed_dataTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCompression completed in Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72-Te6edf3compression_beganTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff secondsTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcompressed_data Tff7b72= Tff7b72selfTff7b72.Td2a8ffuncompressed_data

Tff7b72selfTff7b72.Td2a8ffuncompressed_size Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffuncompressed_dataTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcompressed_size Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcompressed_dataTb4b4b4)

Tff7b72if Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffcompressed_size Tff7b72< Tff7b72selfTff7b72.Td2a8ffuncompressed_size Tff7b72and Te6edf3auto_compressTb4b4b4)Tb4b4b4:
Te6edf3saved_bytes Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffuncompressed_dataTb4b4b4) Tff7b72- Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcompressed_dataTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCompression saved Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3saved_bytesTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff bytes, sending compressedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72selfTff7b72.Td2a8ffdata Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ffdata Tff7b72+Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffget_random_hashTb4b4b4(Tb4b4b4)Tb4b4b4[Tb4b4b4:Te6edf3ResourceTff7b72.Td2a8ffRANDOM_HASH_SIZETb4b4b4]
Tff7b72selfTff7b72.Td2a8ffdata Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffcompressed_data
Tff7b72selfTff7b72.Td2a8ffcompressed Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffuncompressed_data Tff7b72= Tff7b72None

Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdata Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ffdata Tff7b72+Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffget_random_hashTb4b4b4(Tb4b4b4)Tb4b4b4[Tb4b4b4:Te6edf3ResourceTff7b72.Td2a8ffRANDOM_HASH_SIZETb4b4b4]
Tff7b72selfTff7b72.Td2a8ffdata Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffuncompressed_data
Tff7b72selfTff7b72.Td2a8ffuncompressed_data Tff7b72= Tff7b72selfTff7b72.Td2a8ffdata

Tff7b72selfTff7b72.Td2a8ffcompressed Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffcompressed_data Tff7b72= Tff7b72None
Tff7b72if Te6edf3auto_compressTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCompression did not decrease size, sending uncompressedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

T8b949e# Resources handle encryption directly to
T8b949e# make optimal use of packet MTU on an entire
T8b949e# encrypted stream. The Resource instance will
T8b949e# use it's underlying link directly to encrypt.
Tff7b72selfTff7b72.Td2a8ffdata Tff7b72= Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffencryptTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdataTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffencrypted Tff7b72= Tff7b72True

Tff7b72selfTff7b72.Td2a8ffsize Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdataTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsent_parts Tff7b72= T79c0ff0
Te6edf3hashmap_entries Tff7b72= Tffa657intTb4b4b4(Te6edf3mathTff7b72.Td2a8ffceilTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsizeTff7b72/Tffa657floatTb4b4b4(Te6edf3ResourceTff7b72.Td2a8ffSDUTb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3hashmap_ok Tff7b72= Tff7b72False
Tff7b72while Tff7b72not Te6edf3hashmap_okTb4b4b4:
Te6edf3hashmap_computation_began Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffStarting resource hashmap computation with Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3hashmap_entriesTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff entries...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72selfTff7b72.Td2a8ffrandom_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffget_random_hashTb4b4b4(Tb4b4b4)Tb4b4b4[Tb4b4b4:Te6edf3ResourceTff7b72.Td2a8ffRANDOM_HASH_SIZETb4b4b4]
Tff7b72selfTff7b72.Td2a8ffhash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3dataTff7b72+Tff7b72selfTff7b72.Td2a8ffrandom_hashTb4b4b4)
Tff7b72selfTff7b72.Td2a8fftruncated_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fftruncated_hashTb4b4b4(Te6edf3dataTff7b72+Tff7b72selfTff7b72.Td2a8ffrandom_hashTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffexpected_proof Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3dataTff7b72+Tff7b72selfTff7b72.Td2a8ffhashTb4b4b4)

Tff7b72if Te6edf3original_hash Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8fforiginal_hash Tff7b72= Tff7b72selfTff7b72.Td2a8ffhash
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8fforiginal_hash Tff7b72= Te6edf3original_hash

Tff7b72selfTff7b72.Td2a8ffparts Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffhashmap Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Te6edf3collision_guard_list Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff0Tb4b4b4,Te6edf3hashmap_entriesTb4b4b4)Tb4b4b4:
Te6edf3data Tff7b72= Tff7b72selfTff7b72.Td2a8ffdataTb4b4b4[Te6edf3iTff7b72*Te6edf3ResourceTff7b72.Td2a8ffSDUTb4b4b4:Tb4b4b4(Te6edf3iTff7b72+T79c0ff1Tb4b4b4)Tff7b72*Te6edf3ResourceTff7b72.Td2a8ffSDUTb4b4b4]
Te6edf3map_hash Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_map_hashTb4b4b4(Te6edf3dataTb4b4b4)

Tff7b72if Te6edf3map_hash Tff7b72in Te6edf3collision_guard_listTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffFound hash collision in resource map, remapping...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Te6edf3hashmap_ok Tff7b72= Tff7b72False
Tff7b72break
Tff7b72elseTb4b4b4:
Te6edf3hashmap_ok Tff7b72= Tff7b72True
Te6edf3collision_guard_listTff7b72.Td2a8ffappendTb4b4b4(Te6edf3map_hashTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3collision_guard_listTb4b4b4) Tff7b72> Te6edf3ResourceAdvertisementTff7b72.Td2a8ffCOLLISION_GUARD_SIZETb4b4b4:
Te6edf3collision_guard_listTff7b72.Td2a8ffpopTb4b4b4(T79c0ff0Tb4b4b4)

Te6edf3part Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Te6edf3linkTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3contextTff7b72=Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffRESOURCETb4b4b4)
Te6edf3partTff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)
Te6edf3partTff7b72.Td2a8ffmap_hash Tff7b72= Te6edf3map_hash

Tff7b72selfTff7b72.Td2a8ffhashmap Tff7b72+Tff7b72= Te6edf3partTff7b72.Td2a8ffmap_hash
Tff7b72selfTff7b72.Td2a8ffpartsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3partTb4b4b4)

Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffHashmap computation concluded in Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72-Te6edf3hashmap_computation_beganTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff secondsTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Te6edf3advertiseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffadvertiseTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72pass

Tff7b72def Td2a8ffhashmap_update_packetTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3plaintextTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffFAILEDTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflast_activity Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffretries_left Tff7b72= Tff7b72selfTff7b72.Td2a8ffmax_retries

Te6edf3update Tff7b72= Te6edf3umsgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3plaintextTb4b4b4[Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffHASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4:Tb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffhashmap_updateTb4b4b4(Te6edf3updateTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Te6edf3updateTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)


Tff7b72def Td2a8ffhashmap_updateTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3segmentTb4b4b4, Te6edf3hashmapTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffFAILEDTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffTRANSFERRING
Te6edf3seg_len Tff7b72= Te6edf3ResourceAdvertisementTff7b72.Td2a8ffHASHMAP_MAX_LEN
Te6edf3hashes Tff7b72= Tffa657lenTb4b4b4(Te6edf3hashmapTb4b4b4)Tff7b72/Tff7b72/Te6edf3ResourceTff7b72.Td2a8ffMAPHASH_LEN
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff0Tb4b4b4,Te6edf3hashesTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffhashmapTb4b4b4[Te6edf3iTff7b72+Te6edf3segmentTff7b72*Te6edf3seg_lenTb4b4b4] Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhashmap_height Tff7b72+Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ffhashmapTb4b4b4[Te6edf3iTff7b72+Te6edf3segmentTff7b72*Te6edf3seg_lenTb4b4b4] Tff7b72= Te6edf3hashmapTb4b4b4[Te6edf3iTff7b72*Te6edf3ResourceTff7b72.Td2a8ffMAPHASH_LENTb4b4b4:Tb4b4b4(Te6edf3iTff7b72+T79c0ff1Tb4b4b4)Tff7b72*Te6edf3ResourceTff7b72.Td2a8ffMAPHASH_LENTb4b4b4]

Tff7b72selfTff7b72.Td2a8ffwaiting_for_hmu Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffrequest_nextTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffget_map_hashTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3dataTff7b72+Tff7b72selfTff7b72.Td2a8ffrandom_hashTb4b4b4)Tb4b4b4[Tb4b4b4:Te6edf3ResourceTff7b72.Td2a8ffMAPHASH_LENTb4b4b4]

Tff7b72def Td2a8ffadvertiseTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""
Advertise the resource. If the other end of the link accepts
the resource advertisement it will begin transferring.
"""
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ff__advertise_jobTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ff__advertise_jobTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffadvertisement_packet Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Tff7b72selfTff7b72.Td2a8fflinkTb4b4b4, Te6edf3ResourceAdvertisementTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3contextTff7b72=Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffRESOURCE_ADVTb4b4b4)
Tff7b72while Tff7b72not Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffready_for_new_resourceTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffQUEUED
Te6edf3sleepTb4b4b4(T79c0ff0.25Tb4b4b4)

Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffadvertisement_packetTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflast_activity Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffadv_sent Tff7b72= Tff7b72selfTff7b72.Td2a8fflast_activity
Tff7b72selfTff7b72.Td2a8ffrtt Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffADVERTISED
Tff7b72selfTff7b72.Td2a8ffretries_left Tff7b72= Tff7b72selfTff7b72.Td2a8ffmax_adv_retries
Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffregister_outgoing_resourceTb4b4b4(Tff7b72selfTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSent resource advertisement for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not advertise resource, the contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
Tff7b72return

Tff7b72selfTff7b72.Td2a8ffwatchdog_jobTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffwatchdog_jobTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ff__watchdog_jobTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ff__watchdog_jobTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__watchdog_job_id Tff7b72+Tff7b72= T79c0ff1
Te6edf3this_job_id Tff7b72= Tff7b72selfTff7b72.Td2a8ff__watchdog_job_id

Tff7b72while Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72< Te6edf3ResourceTff7b72.Td2a8ffASSEMBLING Tff7b72and Te6edf3this_job_id Tff7b72== Tff7b72selfTff7b72.Td2a8ff__watchdog_job_idTb4b4b4:
Tff7b72while Tff7b72selfTff7b72.Td2a8ffwatchdog_lockTb4b4b4:
Te6edf3sleepTb4b4b4(T79c0ff0.025Tb4b4b4)

Te6edf3sleep_time Tff7b72= Tff7b72None

Tff7b72if Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffADVERTISEDTb4b4b4:
Te6edf3sleep_time Tff7b72= Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffadv_sentTff7b72+Tff7b72selfTff7b72.Td2a8fftimeoutTb4b4b4)Tff7b72-Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3sleep_time Tff7b72< T79c0ff0Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffretries_left Tff7b72<Tff7b72= T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffResource transfer timeout after sending advertisementTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
Te6edf3sleep_time Tff7b72= T79c0ff0.001
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNo part requests received, retrying resource advertisement...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffretries_left Tff7b72-Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ffadvertisement_packet Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Tff7b72selfTff7b72.Td2a8fflinkTb4b4b4, Te6edf3ResourceAdvertisementTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3contextTff7b72=Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffRESOURCE_ADVTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffadvertisement_packetTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflast_activity Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffadv_sent Tff7b72= Tff7b72selfTff7b72.Td2a8fflast_activity
Te6edf3sleep_time Tff7b72= T79c0ff0.001
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not resend advertisement packet, cancelling resourceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)

Tff7b72elif Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffTRANSFERRINGTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffinitiatorTb4b4b4:

Tff7b72if Tff7b72selfTff7b72.Td2a8ffrtt Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3rtt Tff7b72= Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffrtt
Tff7b72elseTb4b4b4:
Te6edf3rtt Tff7b72= Tff7b72selfTff7b72.Td2a8ffrtt

Te6edf3window_remaining Tff7b72= Tff7b72selfTff7b72.Td2a8ffoutstanding_parts

Te6edf3retries_used Tff7b72= Tff7b72selfTff7b72.Td2a8ffmax_retries Tff7b72- Tff7b72selfTff7b72.Td2a8ffretries_left
Te6edf3extra_wait Tff7b72= Te6edf3retries_used Tff7b72* Te6edf3ResourceTff7b72.Td2a8ffPER_RETRY_DELAY
Te6edf3sleep_time Tff7b72= Tff7b72selfTff7b72.Td2a8fflast_activity Tff7b72+ Tb4b4b4(Te6edf3rttTff7b72*Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffpart_timeout_factorTff7b72+Te6edf3window_remainingTb4b4b4)Tb4b4b4) Tff7b72+ Te6edf3ResourceTff7b72.Td2a8ffRETRY_GRACE_TIME Tff7b72+ Te6edf3extra_wait Tff7b72- Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3sleep_time Tff7b72< T79c0ff0Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffretries_left Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3ms Tff7b72= Ta5d6ff"Ta5d6ff" Tff7b72if Tff7b72selfTff7b72.Td2a8ffoutstanding_parts Tff7b72== T79c0ff1 Tff7b72else Ta5d6ff"Ta5d6ffsTa5d6ff"
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffTimed out waiting for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffoutstanding_partsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff partTa5d6ff"Tff7b72+Te6edf3msTff7b72+Ta5d6ff"Ta5d6ff, requesting retryTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffwindow Tff7b72> Tff7b72selfTff7b72.Td2a8ffwindow_minTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwindow Tff7b72-Tff7b72= T79c0ff1
Tff7b72if Tff7b72selfTff7b72.Td2a8ffwindow_max Tff7b72> Tff7b72selfTff7b72.Td2a8ffwindow_minTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwindow_max Tff7b72-Tff7b72= T79c0ff1
Tff7b72if Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffwindow_max Tff7b72- Tff7b72selfTff7b72.Td2a8ffwindowTb4b4b4) Tff7b72> Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffwindow_flexibilityTff7b72-T79c0ff1Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwindow_max Tff7b72-Tff7b72= T79c0ff1

Te6edf3sleep_time Tff7b72= T79c0ff0.001
Tff7b72selfTff7b72.Td2a8ffretries_left Tff7b72-Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ffwaiting_for_hmu Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffrequest_nextTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
Te6edf3sleep_time Tff7b72= T79c0ff0.001
Tff7b72elseTb4b4b4:
Te6edf3max_extra_wait Tff7b72= Tffa657sumTb4b4b4(Tb4b4b4[Tb4b4b4(Te6edf3rTff7b72+T79c0ff1Tb4b4b4) Tff7b72* Te6edf3ResourceTff7b72.Td2a8ffPER_RETRY_DELAY Tff7b72for Te6edf3r Tff7b72in Tffa657rangeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffMAX_RETRIESTb4b4b4)Tb4b4b4]Tb4b4b4)
Te6edf3max_wait Tff7b72= Tff7b72selfTff7b72.Td2a8ffrtt Tff7b72* Tff7b72selfTff7b72.Td2a8fftimeout_factor Tff7b72* Tff7b72selfTff7b72.Td2a8ffmax_retries Tff7b72+ Tff7b72selfTff7b72.Td2a8ffsender_grace_time Tff7b72+ Te6edf3max_extra_wait
Te6edf3sleep_time Tff7b72= Tff7b72selfTff7b72.Td2a8fflast_activity Tff7b72+ Te6edf3max_wait Tff7b72- Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3sleep_time Tff7b72< T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffResource timed out waiting for part requestsTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
Te6edf3sleep_time Tff7b72= T79c0ff0.001

Tff7b72elif Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffAWAITING_PROOFTb4b4b4:
Te6edf3sleep_time Tff7b72= Tff7b72selfTff7b72.Td2a8fflast_part_sent Tff7b72+ Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffrttTff7b72*Tff7b72selfTff7b72.Td2a8fftimeout_factorTff7b72+Tff7b72selfTff7b72.Td2a8ffsender_grace_timeTb4b4b4) Tff7b72- Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3sleep_time Tff7b72< T79c0ff0Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffretries_left Tff7b72<Tff7b72= T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffResource timed out waiting for proofTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
Te6edf3sleep_time Tff7b72= T79c0ff0.001
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAll parts sent, but no resource proof received, querying network cache...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffretries_left Tff7b72-Tff7b72= T79c0ff1
Te6edf3expected_data Tff7b72= Tff7b72selfTff7b72.Td2a8ffhash Tff7b72+ Tff7b72selfTff7b72.Td2a8ffexpected_proof
Te6edf3expected_proof_packet Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Tff7b72selfTff7b72.Td2a8fflinkTb4b4b4, Te6edf3expected_dataTb4b4b4, Te6edf3packet_typeTff7b72=Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffPROOFTb4b4b4, Te6edf3contextTff7b72=Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffRESOURCE_PRFTb4b4b4)
Te6edf3expected_proof_packetTff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffcache_requestTb4b4b4(Te6edf3expected_proof_packetTff7b72.Td2a8ffpacket_hashTb4b4b4, Tff7b72selfTff7b72.Td2a8fflinkTb4b4b4)
Tff7b72selfTff7b72.Td2a8fflast_part_sent Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3sleep_time Tff7b72= T79c0ff0.001

Tff7b72if Te6edf3sleep_time Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffWarning! Link watchdog sleep time of 0!Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72if Te6edf3sleep_time Tff7b72== Tff7b72None Tff7b72or Te6edf3sleep_time Tff7b72< T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffTiming error, cancelling resource transfer.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3sleep_time Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3sleepTb4b4b4(Tffa657minTb4b4b4(Te6edf3sleep_timeTb4b4b4, Te6edf3ResourceTff7b72.Td2a8ffWATCHDOG_MAX_SLEEPTb4b4b4)Tb4b4b4)

Tff7b72def Td2a8ffassembleTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffFAILEDTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffASSEMBLING
Te6edf3stream Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpartsTb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffencryptedTb4b4b4:
Te6edf3data Tff7b72= Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffdecryptTb4b4b4(Te6edf3streamTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3data Tff7b72= Te6edf3stream

T8b949e# Strip off random hash
Te6edf3data Tff7b72= Te6edf3dataTb4b4b4[Te6edf3ResourceTff7b72.Td2a8ffRANDOM_HASH_SIZETb4b4b4:Tb4b4b4]

Tff7b72if Tff7b72selfTff7b72.Td2a8ffcompressedTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdata Tff7b72= Te6edf3bz2Tff7b72.Td2a8ffdecompressTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdata Tff7b72= Te6edf3data

Te6edf3calculated_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdataTff7b72+Tff7b72selfTff7b72.Td2a8ffrandom_hashTb4b4b4)

Tff7b72if Te6edf3calculated_hash Tff7b72== Tff7b72selfTff7b72.Td2a8ffhashTb4b4b4:
Tff7b72selfTff7b72.Td2a8fffile Tff7b72= Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragepathTb4b4b4, Ta5d6ff"Ta5d6ffabTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fffileTff7b72.Td2a8ffwriteTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdataTb4b4b4)
Tff7b72selfTff7b72.Td2a8fffileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffCOMPLETE
Tff7b72selfTff7b72.Td2a8ffproveTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffCORRUPT


Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while assembling received resource.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffCORRUPT

Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffresource_concludedTb4b4b4(Tff7b72selfTb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffsegment_index Tff7b72== Tff7b72selfTff7b72.Td2a8fftotal_segmentsTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffcallback Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdata Tff7b72= Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragepathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcallbackTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while executing resource assembled callback from Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72tryTb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdataTb4b4b4, Ta5d6ff"Ta5d6ffcloseTa5d6ff"Tb4b4b4) Tff7b72and Tffa657callableTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdataTff7b72.Td2a8ffcloseTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdataTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)

Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragepathTb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while cleaning up resource files, the contained exception was:Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffResource segment Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsegment_indexTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff of Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8fftotal_segmentsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff received, waiting for next segment to be announcedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)


Tff7b72def Td2a8ffproveTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffFAILEDTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3proof Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdataTff7b72+Tff7b72selfTff7b72.Td2a8ffhashTb4b4b4)
Te6edf3proof_data Tff7b72= Tff7b72selfTff7b72.Td2a8ffhashTff7b72+Te6edf3proof
Te6edf3proof_packet Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Tff7b72selfTff7b72.Td2a8fflinkTb4b4b4, Te6edf3proof_dataTb4b4b4, Te6edf3packet_typeTff7b72=Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffPROOFTb4b4b4, Te6edf3contextTff7b72=Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffRESOURCE_PRFTb4b4b4)
Te6edf3proof_packetTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not send proof packet, cancelling resourceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffvalidate_proofTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3proof_dataTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffFAILEDTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3proof_dataTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffHASHLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72*T79c0ff2Tb4b4b4:
Tff7b72if Te6edf3proof_dataTb4b4b4[Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffHASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4:Tb4b4b4] Tff7b72== Tff7b72selfTff7b72.Td2a8ffexpected_proofTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffCOMPLETE
Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffresource_concludedTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsegment_index Tff7b72== Tff7b72selfTff7b72.Td2a8fftotal_segmentsTb4b4b4:
T8b949e# If all segments were processed, we'll
T8b949e# signal that the resource sending concluded
Tff7b72if Tff7b72selfTff7b72.Td2a8ffcallback Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcallbackTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while executing resource concluded callback from Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e# Otherwise we'll recursively create the
T8b949e# next segment of the resource
Te6edf3ResourceTb4b4b4(Tff7b72selfTff7b72.Td2a8ffinput_fileTb4b4b4, Tff7b72selfTff7b72.Td2a8fflinkTb4b4b4, Te6edf3callback Tff7b72= Tff7b72selfTff7b72.Td2a8ffcallbackTb4b4b4, Te6edf3segment_index Tff7b72= Tff7b72selfTff7b72.Td2a8ffsegment_indexTff7b72+T79c0ff1Tb4b4b4, Te6edf3original_hashTff7b72=Tff7b72selfTff7b72.Td2a8fforiginal_hashTb4b4b4, Te6edf3progress_callback Tff7b72= Tff7b72selfTff7b72.Td2a8ff__progress_callbackTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72pass
Tff7b72elseTb4b4b4:
Tff7b72pass


Tff7b72def Td2a8ffreceive_partTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3packetTb4b4b4)Tb4b4b4:
Tff7b72while Tff7b72selfTff7b72.Td2a8ffreceiving_partTb4b4b4:
Te6edf3sleepTb4b4b4(T79c0ff0.001Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffreceiving_part Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fflast_activity Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffretries_left Tff7b72= Tff7b72selfTff7b72.Td2a8ffmax_retries

Tff7b72if Tff7b72selfTff7b72.Td2a8ffreq_resp Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreq_resp Tff7b72= Tff7b72selfTff7b72.Td2a8fflast_activity
Te6edf3rtt Tff7b72= Tff7b72selfTff7b72.Td2a8ffreq_respTff7b72-Tff7b72selfTff7b72.Td2a8ffreq_sent
Tff7b72selfTff7b72.Td2a8ffpart_timeout_factor Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffPART_TIMEOUT_FACTOR_AFTER_RTT
Tff7b72if Tff7b72selfTff7b72.Td2a8ffrtt Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrtt Tff7b72= Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffrtt
Tff7b72selfTff7b72.Td2a8ffwatchdog_jobTb4b4b4(Tb4b4b4)
Tff7b72elif Te6edf3rtt Tff7b72< Tff7b72selfTff7b72.Td2a8ffrttTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrtt Tff7b72= Tffa657maxTb4b4b4(Tff7b72selfTff7b72.Td2a8ffrtt Tff7b72- Tff7b72selfTff7b72.Td2a8ffrttTff7b72*T79c0ff0.05Tb4b4b4, Te6edf3rttTb4b4b4)
Tff7b72elif Te6edf3rtt Tff7b72> Tff7b72selfTff7b72.Td2a8ffrttTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrtt Tff7b72= Tffa657minTb4b4b4(Tff7b72selfTff7b72.Td2a8ffrtt Tff7b72+ Tff7b72selfTff7b72.Td2a8ffrttTff7b72*T79c0ff0.05Tb4b4b4, Te6edf3rttTb4b4b4)

Tff7b72if Te6edf3rtt Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3req_resp_cost Tff7b72= Tffa657lenTb4b4b4(Te6edf3packetTff7b72.Td2a8ffrawTb4b4b4)Tff7b72+Tff7b72selfTff7b72.Td2a8ffreq_sent_bytes
Tff7b72selfTff7b72.Td2a8ffreq_resp_rtt_rate Tff7b72= Te6edf3req_resp_cost Tff7b72/ Te6edf3rtt

Tff7b72if Tff7b72selfTff7b72.Td2a8ffreq_resp_rtt_rate Tff7b72> Te6edf3ResourceTff7b72.Td2a8ffRATE_FAST Tff7b72and Tff7b72selfTff7b72.Td2a8fffast_rate_rounds Tff7b72< Te6edf3ResourceTff7b72.Td2a8ffFAST_RATE_THRESHOLDTb4b4b4:
Tff7b72selfTff7b72.Td2a8fffast_rate_rounds Tff7b72+Tff7b72= T79c0ff1

Tff7b72if Tff7b72selfTff7b72.Td2a8fffast_rate_rounds Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffFAST_RATE_THRESHOLDTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwindow_max Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffWINDOW_MAX_FAST

Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffFAILEDTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffTRANSFERRING
Te6edf3part_data Tff7b72= Te6edf3packetTff7b72.Td2a8ffdata
Te6edf3part_hash Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_map_hashTb4b4b4(Te6edf3part_dataTb4b4b4)

Te6edf3i Tff7b72= Tff7b72selfTff7b72.Td2a8ffconsecutive_completed_height
Tff7b72for Te6edf3map_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffhashmapTb4b4b4[Tff7b72selfTff7b72.Td2a8ffconsecutive_completed_heightTb4b4b4:Tff7b72selfTff7b72.Td2a8ffconsecutive_completed_heightTff7b72+Tff7b72selfTff7b72.Td2a8ffwindowTb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3map_hash Tff7b72== Te6edf3part_hashTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffpartsTb4b4b4[Te6edf3iTb4b4b4] Tff7b72== Tff7b72NoneTb4b4b4:
T8b949e# Insert data into parts list
Tff7b72selfTff7b72.Td2a8ffpartsTb4b4b4[Te6edf3iTb4b4b4] Tff7b72= Te6edf3part_data
Tff7b72selfTff7b72.Td2a8ffrtt_rxd_bytes Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3part_dataTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffreceived_count Tff7b72+Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ffoutstanding_parts Tff7b72-Tff7b72= T79c0ff1

T8b949e# Update consecutive completed pointer
Tff7b72if Te6edf3i Tff7b72== Tff7b72selfTff7b72.Td2a8ffconsecutive_completed_height Tff7b72+ T79c0ff1Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconsecutive_completed_height Tff7b72= Te6edf3i
Te6edf3cp Tff7b72= Tff7b72selfTff7b72.Td2a8ffconsecutive_completed_height Tff7b72+ T79c0ff1
Tff7b72while Te6edf3cp Tff7b72< Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpartsTb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ffpartsTb4b4b4[Te6edf3cpTb4b4b4] Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconsecutive_completed_height Tff7b72= Te6edf3cp
Te6edf3cp Tff7b72+Tff7b72= T79c0ff1

Tff7b72if Tff7b72selfTff7b72.Td2a8ff__progress_callback Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__progress_callbackTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while executing progress callback from Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Te6edf3i Tff7b72+Tff7b72= T79c0ff1

Tff7b72selfTff7b72.Td2a8ffreceiving_part Tff7b72= Tff7b72False

Tff7b72if Tff7b72selfTff7b72.Td2a8ffreceived_count Tff7b72== Tff7b72selfTff7b72.Td2a8fftotal_parts Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ffassembly_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffassembly_lock Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffassembleTb4b4b4(Tb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffoutstanding_parts Tff7b72== T79c0ff0Tb4b4b4:
T8b949e# TODO: Figure out if there is a mathematically
T8b949e# optimal way to adjust windows
Tff7b72if Tff7b72selfTff7b72.Td2a8ffwindow Tff7b72< Tff7b72selfTff7b72.Td2a8ffwindow_maxTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwindow Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffwindow Tff7b72- Tff7b72selfTff7b72.Td2a8ffwindow_minTb4b4b4) Tff7b72> Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffwindow_flexibilityTff7b72-T79c0ff1Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwindow_min Tff7b72+Tff7b72= T79c0ff1

Tff7b72if Tff7b72selfTff7b72.Td2a8ffreq_sent Tff7b72!= T79c0ff0Tb4b4b4:
Te6edf3rtt Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72-Tff7b72selfTff7b72.Td2a8ffreq_sent
Te6edf3req_transferred Tff7b72= Tff7b72selfTff7b72.Td2a8ffrtt_rxd_bytes Tff7b72- Tff7b72selfTff7b72.Td2a8ffrtt_rxd_bytes_at_part_req

Tff7b72if Te6edf3rtt Tff7b72!= T79c0ff0Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreq_data_rtt_rate Tff7b72= Te6edf3req_transferredTff7b72/Te6edf3rtt
Tff7b72selfTff7b72.Td2a8ffrtt_rxd_bytes_at_part_req Tff7b72= Tff7b72selfTff7b72.Td2a8ffrtt_rxd_bytes

Tff7b72if Tff7b72selfTff7b72.Td2a8ffreq_data_rtt_rate Tff7b72> Te6edf3ResourceTff7b72.Td2a8ffRATE_FAST Tff7b72and Tff7b72selfTff7b72.Td2a8fffast_rate_rounds Tff7b72< Te6edf3ResourceTff7b72.Td2a8ffFAST_RATE_THRESHOLDTb4b4b4:
Tff7b72selfTff7b72.Td2a8fffast_rate_rounds Tff7b72+Tff7b72= T79c0ff1

Tff7b72if Tff7b72selfTff7b72.Td2a8fffast_rate_rounds Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffFAST_RATE_THRESHOLDTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwindow_max Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffWINDOW_MAX_FAST

Tff7b72selfTff7b72.Td2a8ffrequest_nextTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreceiving_part Tff7b72= Tff7b72False

T8b949e# Called on incoming resource to send a request for more data
Tff7b72def Td2a8ffrequest_nextTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72while Tff7b72selfTff7b72.Td2a8ffreceiving_partTb4b4b4:
Te6edf3sleepTb4b4b4(T79c0ff0.001Tb4b4b4)

Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffFAILEDTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffwaiting_for_hmuTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffoutstanding_parts Tff7b72= T79c0ff0
Te6edf3hashmap_exhausted Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffHASHMAP_IS_NOT_EXHAUSTED
Te6edf3requested_hashes Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"

Te6edf3offset Tff7b72= Tb4b4b4(T79c0ff1 Tff7b72if Tff7b72selfTff7b72.Td2a8ffconsecutive_completed_height Tff7b72> T79c0ff0 Tff7b72else T79c0ff0Tb4b4b4)
Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3pn Tff7b72= Tff7b72selfTff7b72.Td2a8ffconsecutive_completed_heightTff7b72+Te6edf3offset
Te6edf3search_start Tff7b72= Te6edf3pn

Tff7b72for Te6edf3part Tff7b72in Tff7b72selfTff7b72.Td2a8ffpartsTb4b4b4[Te6edf3search_startTb4b4b4:Te6edf3search_startTff7b72+Tff7b72selfTff7b72.Td2a8ffwindowTb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3part Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3part_hash Tff7b72= Tff7b72selfTff7b72.Td2a8ffhashmapTb4b4b4[Te6edf3pnTb4b4b4]
Tff7b72if Te6edf3part_hash Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3requested_hashes Tff7b72+Tff7b72= Te6edf3part_hash
Tff7b72selfTff7b72.Td2a8ffoutstanding_parts Tff7b72+Tff7b72= T79c0ff1
Te6edf3i Tff7b72+Tff7b72= T79c0ff1
Tff7b72elseTb4b4b4:
Te6edf3hashmap_exhausted Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffHASHMAP_IS_EXHAUSTED

Te6edf3pn Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3i Tff7b72>Tff7b72= Tff7b72selfTff7b72.Td2a8ffwindow Tff7b72or Te6edf3hashmap_exhausted Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffHASHMAP_IS_EXHAUSTEDTb4b4b4:
Tff7b72break

Te6edf3hmu_part Tff7b72= Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3hashmap_exhaustedTb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3hashmap_exhausted Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffHASHMAP_IS_EXHAUSTEDTb4b4b4:
Te6edf3last_map_hash Tff7b72= Tff7b72selfTff7b72.Td2a8ffhashmapTb4b4b4[Tff7b72selfTff7b72.Td2a8ffhashmap_heightTff7b72-T79c0ff1Tb4b4b4]
Te6edf3hmu_part Tff7b72+Tff7b72= Te6edf3last_map_hash
Tff7b72selfTff7b72.Td2a8ffwaiting_for_hmu Tff7b72= Tff7b72True

Te6edf3requested_data Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Te6edf3request_data Tff7b72= Te6edf3hmu_part Tff7b72+ Tff7b72selfTff7b72.Td2a8ffhash Tff7b72+ Te6edf3requested_hashes
Te6edf3request_packet Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Tff7b72selfTff7b72.Td2a8fflinkTb4b4b4, Te6edf3request_dataTb4b4b4, Te6edf3context Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffRESOURCE_REQTb4b4b4)

Tff7b72tryTb4b4b4:
Te6edf3request_packetTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflast_activity Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffreq_sent Tff7b72= Tff7b72selfTff7b72.Td2a8fflast_activity
Tff7b72selfTff7b72.Td2a8ffreq_sent_bytes Tff7b72= Tffa657lenTb4b4b4(Te6edf3request_packetTff7b72.Td2a8ffrawTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffreq_resp Tff7b72= Tff7b72None
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not send resource request packet, cancelling resourceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)

T8b949e# Called on outgoing resource to make it send more data
Tff7b72def Td2a8ffrequestTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3request_dataTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffFAILEDTb4b4b4:
Te6edf3rtt Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Tff7b72selfTff7b72.Td2a8ffadv_sent
Tff7b72if Tff7b72selfTff7b72.Td2a8ffrtt Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrtt Tff7b72= Te6edf3rtt

Tff7b72if Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72!= Te6edf3ResourceTff7b72.Td2a8ffTRANSFERRINGTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffTRANSFERRING
Tff7b72selfTff7b72.Td2a8ffwatchdog_jobTb4b4b4(Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffretries_left Tff7b72= Tff7b72selfTff7b72.Td2a8ffmax_retries

Te6edf3wants_more_hashmap Tff7b72= Tff7b72True Tff7b72if Te6edf3request_dataTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffHASHMAP_IS_EXHAUSTED Tff7b72else Tff7b72False
Te6edf3pad Tff7b72= T79c0ff1Tff7b72+Te6edf3ResourceTff7b72.Td2a8ffMAPHASH_LEN Tff7b72if Te6edf3wants_more_hashmap Tff7b72else T79c0ff1

Te6edf3requested_hashes Tff7b72= Te6edf3request_dataTb4b4b4[Te6edf3padTff7b72+Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffHASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4:Tb4b4b4]

T8b949e# Define the search scope
Te6edf3search_start Tff7b72= Tff7b72selfTff7b72.Td2a8ffreceiver_min_consecutive_height
Te6edf3search_end Tff7b72= Tff7b72selfTff7b72.Td2a8ffreceiver_min_consecutive_heightTff7b72+Te6edf3ResourceAdvertisementTff7b72.Td2a8ffCOLLISION_GUARD_SIZE

Te6edf3map_hashes Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff0Tb4b4b4,Tffa657lenTb4b4b4(Te6edf3requested_hashesTb4b4b4)Tff7b72/Tff7b72/Te6edf3ResourceTff7b72.Td2a8ffMAPHASH_LENTb4b4b4)Tb4b4b4:
Te6edf3map_hash Tff7b72= Te6edf3requested_hashesTb4b4b4[Te6edf3iTff7b72*Te6edf3ResourceTff7b72.Td2a8ffMAPHASH_LENTb4b4b4:Tb4b4b4(Te6edf3iTff7b72+T79c0ff1Tb4b4b4)Tff7b72*Te6edf3ResourceTff7b72.Td2a8ffMAPHASH_LENTb4b4b4]
Te6edf3map_hashesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3map_hashTb4b4b4)

Te6edf3search_scope Tff7b72= Tff7b72selfTff7b72.Td2a8ffpartsTb4b4b4[Te6edf3search_startTb4b4b4:Te6edf3search_endTb4b4b4]
Te6edf3requested_parts Tff7b72= Tffa657listTb4b4b4(Tffa657filterTb4b4b4(Tff7b72lambda Te6edf3partTb4b4b4: Te6edf3partTff7b72.Td2a8ffmap_hash Tff7b72in Te6edf3map_hashesTb4b4b4, Te6edf3search_scopeTb4b4b4)Tb4b4b4)

Tff7b72for Te6edf3part Tff7b72in Te6edf3requested_partsTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72not Te6edf3partTff7b72.Td2a8ffsentTb4b4b4:
Te6edf3partTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsent_parts Tff7b72+Tff7b72= T79c0ff1
Tff7b72elseTb4b4b4:
Te6edf3partTff7b72.Td2a8ffresendTb4b4b4(Tb4b4b4)

Tff7b72selfTff7b72.Td2a8fflast_activity Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflast_part_sent Tff7b72= Tff7b72selfTff7b72.Td2a8fflast_activity

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffResource could not send parts, cancelling transfer!Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3wants_more_hashmapTb4b4b4:
Te6edf3last_map_hash Tff7b72= Te6edf3request_dataTb4b4b4[T79c0ff1Tb4b4b4:Te6edf3ResourceTff7b72.Td2a8ffMAPHASH_LENTff7b72+T79c0ff1Tb4b4b4]
Te6edf3part_index Tff7b72= Tff7b72selfTff7b72.Td2a8ffreceiver_min_consecutive_height
Te6edf3search_start Tff7b72= Te6edf3part_index
Te6edf3search_end Tff7b72= Tff7b72selfTff7b72.Td2a8ffreceiver_min_consecutive_heightTff7b72+Te6edf3ResourceAdvertisementTff7b72.Td2a8ffCOLLISION_GUARD_SIZE
Tff7b72for Te6edf3part Tff7b72in Tff7b72selfTff7b72.Td2a8ffpartsTb4b4b4[Te6edf3search_startTb4b4b4:Te6edf3search_endTb4b4b4]Tb4b4b4:
Te6edf3part_index Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3partTff7b72.Td2a8ffmap_hash Tff7b72== Te6edf3last_map_hashTb4b4b4:
Tff7b72break

Tff7b72selfTff7b72.Td2a8ffreceiver_min_consecutive_height Tff7b72= Tffa657maxTb4b4b4(Te6edf3part_indexTff7b72-T79c0ff1Tff7b72-Te6edf3ResourceTff7b72.Td2a8ffWINDOW_MAXTb4b4b4, T79c0ff0Tb4b4b4)

Tff7b72if Te6edf3part_index Tff7b72% Te6edf3ResourceAdvertisementTff7b72.Td2a8ffHASHMAP_MAX_LEN Tff7b72!= T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffResource sequencing error, cancelling transfer!Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
Tff7b72return
Tff7b72elseTb4b4b4:
Te6edf3segment Tff7b72= Te6edf3part_index Tff7b72/Tff7b72/ Te6edf3ResourceAdvertisementTff7b72.Td2a8ffHASHMAP_MAX_LEN

Te6edf3hashmap_start Tff7b72= Te6edf3segmentTff7b72*Te6edf3ResourceAdvertisementTff7b72.Td2a8ffHASHMAP_MAX_LEN
Te6edf3hashmap_end Tff7b72= Tffa657minTb4b4b4(Tb4b4b4(Te6edf3segmentTff7b72+T79c0ff1Tb4b4b4)Tff7b72*Te6edf3ResourceAdvertisementTff7b72.Td2a8ffHASHMAP_MAX_LENTb4b4b4, Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpartsTb4b4b4)Tb4b4b4)

Te6edf3hashmap Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(Te6edf3hashmap_startTb4b4b4,Te6edf3hashmap_endTb4b4b4)Tb4b4b4:
Te6edf3hashmap Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffhashmapTb4b4b4[Te6edf3iTff7b72*Te6edf3ResourceTff7b72.Td2a8ffMAPHASH_LENTb4b4b4:Tb4b4b4(Te6edf3iTff7b72+T79c0ff1Tb4b4b4)Tff7b72*Te6edf3ResourceTff7b72.Td2a8ffMAPHASH_LENTb4b4b4]

Te6edf3hmu Tff7b72= Tff7b72selfTff7b72.Td2a8ffhashTff7b72+Te6edf3umsgpackTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4[Te6edf3segmentTb4b4b4, Te6edf3hashmapTb4b4b4]Tb4b4b4)
Te6edf3hmu_packet Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Tff7b72selfTff7b72.Td2a8fflinkTb4b4b4, Te6edf3hmuTb4b4b4, Te6edf3context Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffRESOURCE_HMUTb4b4b4)

Tff7b72tryTb4b4b4:
Te6edf3hmu_packetTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflast_activity Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not send resource HMU packet, cancelling resourceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffsent_parts Tff7b72== Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpartsTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffAWAITING_PROOF

Tff7b72if Tff7b72selfTff7b72.Td2a8ff__progress_callback Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__progress_callbackTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while executing progress callback from Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72def Td2a8ffcancelTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""
Cancels transferring the resource.
"""
Tff7b72if Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72< Te6edf3ResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffFAILED
Tff7b72if Tff7b72selfTff7b72.Td2a8ffinitiatorTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3cancel_packet Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Tff7b72selfTff7b72.Td2a8fflinkTb4b4b4, Tff7b72selfTff7b72.Td2a8ffhashTb4b4b4, Te6edf3contextTff7b72=Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffRESOURCE_ICLTb4b4b4)
Te6edf3cancel_packetTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not send resource cancel packet, the contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffcancel_outgoing_resourceTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffcancel_incoming_resourceTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffcallback Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffresource_concludedTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcallbackTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while executing callbacks on resource cancel from Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72def Td2a8ffset_callbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3callbackTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcallback Tff7b72= Te6edf3callback

Tff7b72def Td2a8ffprogress_callbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3callbackTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__progress_callback Tff7b72= Te6edf3callback

Tff7b72def Td2a8ffget_progressTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""
:returns: The current progress of the resource transfer as a *float* between 0.0 and 1.0.
"""
Tff7b72if Tff7b72selfTff7b72.Td2a8ffinitiatorTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffprocessed_parts Tff7b72= Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffsegment_indexTff7b72-T79c0ff1Tb4b4b4)Tff7b72*Te6edf3mathTff7b72.Td2a8ffceilTb4b4b4(Te6edf3ResourceTff7b72.Td2a8ffMAX_EFFICIENT_SIZETff7b72/Te6edf3ResourceTff7b72.Td2a8ffSDUTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffprocessed_parts Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffsent_parts
Tff7b72selfTff7b72.Td2a8ffprogress_total_parts Tff7b72= Tffa657floatTb4b4b4(Tff7b72selfTff7b72.Td2a8ffgrand_total_partsTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffprocessed_parts Tff7b72= Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffsegment_indexTff7b72-T79c0ff1Tb4b4b4)Tff7b72*Te6edf3mathTff7b72.Td2a8ffceilTb4b4b4(Te6edf3ResourceTff7b72.Td2a8ffMAX_EFFICIENT_SIZETff7b72/Te6edf3ResourceTff7b72.Td2a8ffSDUTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffprocessed_parts Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffreceived_count
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsplitTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffprogress_total_parts Tff7b72= Tffa657floatTb4b4b4(Te6edf3mathTff7b72.Td2a8ffceilTb4b4b4(Tff7b72selfTff7b72.Td2a8fftotal_sizeTff7b72/Te6edf3ResourceTff7b72.Td2a8ffSDUTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffprogress_total_parts Tff7b72= Tffa657floatTb4b4b4(Tff7b72selfTff7b72.Td2a8fftotal_partsTb4b4b4)

Te6edf3progress Tff7b72= Tff7b72selfTff7b72.Td2a8ffprocessed_parts Tff7b72/ Tff7b72selfTff7b72.Td2a8ffprogress_total_parts
Tff7b72return Te6edf3progress

Tff7b72def Td2a8ffget_transfer_sizeTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""
:returns: The number of bytes needed to transfer the resource.
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ffsize

Tff7b72def Td2a8ffget_data_sizeTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""
:returns: The total data size of the resource.
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8fftotal_size

Tff7b72def Td2a8ffget_partsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""
:returns: The number of parts the resource will be transferred in.
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8fftotal_parts

Tff7b72def Td2a8ffget_segmentsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""
:returns: The number of segments the resource is divided into.
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8fftotal_segments

Tff7b72def Td2a8ffget_hashTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""
:returns: The hash of the resource.
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ffhash

Tff7b72def Td2a8ffis_compressedTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""
:returns: Whether the resource is compressed.
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ffcompressed

Tff7b72def Tff7b72__str__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff<Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhashTb4b4b4,Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8fflink_idTb4b4b4,Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff>Ta5d6ff"


Tff7b72class T56d364ResourceAdvertisementTb4b4b4:
Te6edf3OVERHEAD Tff7b72= T79c0ff134
Te6edf3HASHMAP_MAX_LEN Tff7b72= Te6edf3mathTff7b72.Td2a8fffloorTb4b4b4(Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffMDUTff7b72-Te6edf3OVERHEADTb4b4b4)Tff7b72/Te6edf3ResourceTff7b72.Td2a8ffMAPHASH_LENTb4b4b4)
Te6edf3COLLISION_GUARD_SIZE Tff7b72= T79c0ff2Tff7b72*Te6edf3ResourceTff7b72.Td2a8ffWINDOW_MAXTff7b72+Te6edf3HASHMAP_MAX_LEN

Tff7b72assert Te6edf3HASHMAP_MAX_LEN Tff7b72> T79c0ff0Tb4b4b4, Ta5d6ff"Ta5d6ffThe configured MTU is too small to include any map hashes in resource advertismentsTa5d6ff"

Tf0883e@staticmethod
Tff7b72def Td2a8ffis_requestTb4b4b4(Te6edf3advertisement_packetTb4b4b4)Tb4b4b4:
Te6edf3adv Tff7b72= Te6edf3ResourceAdvertisementTff7b72.Td2a8ffunpackTb4b4b4(Te6edf3advertisement_packetTff7b72.Td2a8ffplaintextTb4b4b4)
Tff7b72if Te6edf3advTff7b72.Td2a8ffq Tff7b72!= Tff7b72None Tff7b72and Te6edf3advTff7b72.Td2a8ffuTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72False


Tf0883e@staticmethod
Tff7b72def Td2a8ffis_responseTb4b4b4(Te6edf3advertisement_packetTb4b4b4)Tb4b4b4:
Te6edf3adv Tff7b72= Te6edf3ResourceAdvertisementTff7b72.Td2a8ffunpackTb4b4b4(Te6edf3advertisement_packetTff7b72.Td2a8ffplaintextTb4b4b4)

Tff7b72if Te6edf3advTff7b72.Td2a8ffq Tff7b72!= Tff7b72None Tff7b72and Te6edf3advTff7b72.Td2a8ffpTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72False


Tf0883e@staticmethod
Tff7b72def Td2a8ffread_request_idTb4b4b4(Te6edf3advertisement_packetTb4b4b4)Tb4b4b4:
Te6edf3adv Tff7b72= Te6edf3ResourceAdvertisementTff7b72.Td2a8ffunpackTb4b4b4(Te6edf3advertisement_packetTff7b72.Td2a8ffplaintextTb4b4b4)
Tff7b72return Te6edf3advTff7b72.Td2a8ffq


Tf0883e@staticmethod
Tff7b72def Td2a8ffread_transfer_sizeTb4b4b4(Te6edf3advertisement_packetTb4b4b4)Tb4b4b4:
Te6edf3adv Tff7b72= Te6edf3ResourceAdvertisementTff7b72.Td2a8ffunpackTb4b4b4(Te6edf3advertisement_packetTff7b72.Td2a8ffplaintextTb4b4b4)
Tff7b72return Te6edf3advTff7b72.Td2a8fft


Tf0883e@staticmethod
Tff7b72def Td2a8ffread_sizeTb4b4b4(Te6edf3advertisement_packetTb4b4b4)Tb4b4b4:
Te6edf3adv Tff7b72= Te6edf3ResourceAdvertisementTff7b72.Td2a8ffunpackTb4b4b4(Te6edf3advertisement_packetTff7b72.Td2a8ffplaintextTb4b4b4)
Tff7b72return Te6edf3advTff7b72.Td2a8ffd


Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3resourceTff7b72=Tff7b72NoneTb4b4b4, Te6edf3request_idTff7b72=Tff7b72NoneTb4b4b4, Te6edf3is_responseTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3resource Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8fft Tff7b72= Te6edf3resourceTff7b72.Td2a8ffsize T8b949e# Transfer size
Tff7b72selfTff7b72.Td2a8ffd Tff7b72= Te6edf3resourceTff7b72.Td2a8fftotal_size T8b949e# Total uncompressed data size
Tff7b72selfTff7b72.Td2a8ffn Tff7b72= Tffa657lenTb4b4b4(Te6edf3resourceTff7b72.Td2a8ffpartsTb4b4b4) T8b949e# Number of parts
Tff7b72selfTff7b72.Td2a8ffh Tff7b72= Te6edf3resourceTff7b72.Td2a8ffhash T8b949e# Resource hash
Tff7b72selfTff7b72.Td2a8ffr Tff7b72= Te6edf3resourceTff7b72.Td2a8ffrandom_hash T8b949e# Resource random hash
Tff7b72selfTff7b72.Td2a8ffo Tff7b72= Te6edf3resourceTff7b72.Td2a8fforiginal_hash T8b949e# First-segment hash
Tff7b72selfTff7b72.Td2a8ffm Tff7b72= Te6edf3resourceTff7b72.Td2a8ffhashmap T8b949e# Resource hashmap
Tff7b72selfTff7b72.Td2a8ffc Tff7b72= Te6edf3resourceTff7b72.Td2a8ffcompressed T8b949e# Compression flag
Tff7b72selfTff7b72.Td2a8ffe Tff7b72= Te6edf3resourceTff7b72.Td2a8ffencrypted T8b949e# Encryption flag
Tff7b72selfTff7b72.Td2a8ffs Tff7b72= Te6edf3resourceTff7b72.Td2a8ffsplit T8b949e# Split flag
Tff7b72selfTff7b72.Td2a8ffi Tff7b72= Te6edf3resourceTff7b72.Td2a8ffsegment_index T8b949e# Segment index
Tff7b72selfTff7b72.Td2a8ffl Tff7b72= Te6edf3resourceTff7b72.Td2a8fftotal_segments T8b949e# Total segments
Tff7b72selfTff7b72.Td2a8ffq Tff7b72= Te6edf3resourceTff7b72.Td2a8ffrequest_id T8b949e# ID of associated request
Tff7b72selfTff7b72.Td2a8ffu Tff7b72= Tff7b72False T8b949e# Is request flag
Tff7b72selfTff7b72.Td2a8ffp Tff7b72= Tff7b72False T8b949e# Is response flag

Tff7b72if Tff7b72selfTff7b72.Td2a8ffq Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Te6edf3resourceTff7b72.Td2a8ffis_responseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffu Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffp Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffu Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffp Tff7b72= Tff7b72True

T8b949e# Flags
Tff7b72selfTff7b72.Td2a8fff Tff7b72= T79c0ff0x00 Tff7b72| Tff7b72selfTff7b72.Td2a8ffp Tff7b72<< T79c0ff4 Tff7b72| Tff7b72selfTff7b72.Td2a8ffu Tff7b72<< T79c0ff3 Tff7b72| Tff7b72selfTff7b72.Td2a8ffs Tff7b72<< T79c0ff2 Tff7b72| Tff7b72selfTff7b72.Td2a8ffc Tff7b72<< T79c0ff1 Tff7b72| Tff7b72selfTff7b72.Td2a8ffe

Tff7b72def Td2a8ffget_transfer_sizeTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8fft

Tff7b72def Td2a8ffget_data_sizeTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffd

Tff7b72def Td2a8ffget_partsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffn

Tff7b72def Td2a8ffget_segmentsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffl

Tff7b72def Td2a8ffget_hashTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffh

Tff7b72def Td2a8ffis_compressedTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffc

Tff7b72def Td2a8ffpackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3segmentTff7b72=T79c0ff0Tb4b4b4)Tb4b4b4:
Te6edf3hashmap_start Tff7b72= Te6edf3segmentTff7b72*Te6edf3ResourceAdvertisementTff7b72.Td2a8ffHASHMAP_MAX_LEN
Te6edf3hashmap_end Tff7b72= Tffa657minTb4b4b4(Tb4b4b4(Te6edf3segmentTff7b72+T79c0ff1Tb4b4b4)Tff7b72*Tb4b4b4(Te6edf3ResourceAdvertisementTff7b72.Td2a8ffHASHMAP_MAX_LENTb4b4b4)Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffnTb4b4b4)

Te6edf3hashmap Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(Te6edf3hashmap_startTb4b4b4,Te6edf3hashmap_endTb4b4b4)Tb4b4b4:
Te6edf3hashmap Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffmTb4b4b4[Te6edf3iTff7b72*Te6edf3ResourceTff7b72.Td2a8ffMAPHASH_LENTb4b4b4:Tb4b4b4(Te6edf3iTff7b72+T79c0ff1Tb4b4b4)Tff7b72*Te6edf3ResourceTff7b72.Td2a8ffMAPHASH_LENTb4b4b4]

Te6edf3dictionary Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6fftTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8fftTb4b4b4, T8b949e# Transfer size
Ta5d6ff"Ta5d6ffdTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffdTb4b4b4, T8b949e# Data size
Ta5d6ff"Ta5d6ffnTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffnTb4b4b4, T8b949e# Number of parts
Ta5d6ff"Ta5d6ffhTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffhTb4b4b4, T8b949e# Resource hash
Ta5d6ff"Ta5d6ffrTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffrTb4b4b4, T8b949e# Resource random hash
Ta5d6ff"Ta5d6ffoTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffoTb4b4b4, T8b949e# Original hash
Ta5d6ff"Ta5d6ffiTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffiTb4b4b4, T8b949e# Segment index
Ta5d6ff"Ta5d6fflTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8fflTb4b4b4, T8b949e# Total segments
Ta5d6ff"Ta5d6ffqTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffqTb4b4b4, T8b949e# Request ID
Ta5d6ff"Ta5d6fffTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8fffTb4b4b4, T8b949e# Resource flags
Ta5d6ff"Ta5d6ffmTa5d6ff"Tb4b4b4: Te6edf3hashmap
Tb4b4b4}

Tff7b72return Te6edf3umsgpackTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3dictionaryTb4b4b4)


Tf0883e@staticmethod
Tff7b72def Td2a8ffunpackTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4:
Te6edf3dictionary Tff7b72= Te6edf3umsgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3dataTb4b4b4)
Te6edf3adv Tff7b72= Te6edf3ResourceAdvertisementTb4b4b4(Tb4b4b4)
Te6edf3advTff7b72.Td2a8fft Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6fftTa5d6ff"Tb4b4b4]
Te6edf3advTff7b72.Td2a8ffd Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffdTa5d6ff"Tb4b4b4]
Te6edf3advTff7b72.Td2a8ffn Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffnTa5d6ff"Tb4b4b4]
Te6edf3advTff7b72.Td2a8ffh Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffhTa5d6ff"Tb4b4b4]
Te6edf3advTff7b72.Td2a8ffr Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffrTa5d6ff"Tb4b4b4]
Te6edf3advTff7b72.Td2a8ffo Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffoTa5d6ff"Tb4b4b4]
Te6edf3advTff7b72.Td2a8ffm Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffmTa5d6ff"Tb4b4b4]
Te6edf3advTff7b72.Td2a8fff Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6fffTa5d6ff"Tb4b4b4]
Te6edf3advTff7b72.Td2a8ffi Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffiTa5d6ff"Tb4b4b4]
Te6edf3advTff7b72.Td2a8ffl Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6fflTa5d6ff"Tb4b4b4]
Te6edf3advTff7b72.Td2a8ffq Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffqTa5d6ff"Tb4b4b4]
Te6edf3advTff7b72.Td2a8ffe Tff7b72= Tff7b72True Tff7b72if Tb4b4b4(Te6edf3advTff7b72.Td2a8fff Tff7b72& T79c0ff0x01Tb4b4b4) Tff7b72== T79c0ff0x01 Tff7b72else Tff7b72False
Te6edf3advTff7b72.Td2a8ffc Tff7b72= Tff7b72True Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3advTff7b72.Td2a8fff Tff7b72>> T79c0ff1Tb4b4b4) Tff7b72& T79c0ff0x01Tb4b4b4) Tff7b72== T79c0ff0x01 Tff7b72else Tff7b72False
Te6edf3advTff7b72.Td2a8ffs Tff7b72= Tff7b72True Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3advTff7b72.Td2a8fff Tff7b72>> T79c0ff2Tb4b4b4) Tff7b72& T79c0ff0x01Tb4b4b4) Tff7b72== T79c0ff0x01 Tff7b72else Tff7b72False
Te6edf3advTff7b72.Td2a8ffu Tff7b72= Tff7b72True Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3advTff7b72.Td2a8fff Tff7b72>> T79c0ff3Tb4b4b4) Tff7b72& T79c0ff0x01Tb4b4b4) Tff7b72== T79c0ff0x01 Tff7b72else Tff7b72False
Te6edf3advTff7b72.Td2a8ffp Tff7b72= Tff7b72True Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3advTff7b72.Td2a8fff Tff7b72>> T79c0ff4Tb4b4b4) Tff7b72& T79c0ff0x01Tb4b4b4) Tff7b72== T79c0ff0x01 Tff7b72else Tff7b72False

Tff7b72return Te6edf3adv

Served by rngit 1.5.1 - Generated in 0.16s